<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>



//【示例1】利用原型为对象设置默认值。当原型属性与本地属性同名时，它们之间可以出现交流现象。利用这种现象为对象初始化默认值。
function p(x){ 	// 构造函数
    if(x) 	// 如果参数存在，则使用该参数设置属性，该条件是关键
        this.x = x; 	// 使用参数初始化本地属性x的值
}
p.prototype.x = 0; 	// 利用原型属性，设置本地属性x的默认值
var p1 = new p();	// 实例化一个没有带参数的对象
alert(p1.x); 	// 返回0，即显示本地属性的默认值
var p2 = new p(1); 	// 再次实例化，传递一个新的参数
alert(p2.x); 	// 返回1，即显示本地属性的初始化值
//【示例2】利用原型间接实现本地数据备份。把本地对象的数据完全赋值给原型对象，相当于为该对象定义一个副本，通俗地说就是备份对象。这样当对象属性被修改时，可以通过原型对象来恢复本地对象的初始值。
function p(x){	// 构造函数
    this.x = x;
}
p.prototype.backup = function(){
	// 原型方法，备份本地对象的数据到原型对象中
    for(var i in this){
        p.prototype[i] = this[i];
    }
}
var p1 = new p(1); 	// 实例化对象
p1.backup();	// 备份实例对象中的数据
p1.x =10; 	// 改写本地对象的属性值
alert(p1.x) 	// 返回10，说明属性值已经被改写
p1 = p.prototype; 	// 恢复备份
alert(p1.x) 	// 返回1，说明对象的属性值已经被恢复到原始值
///【示例3】利用原型还可以为对象属性设置“只读”特性，这在一定程序上可以避免对象内部数据被任意修改的尴尬。

function p(x,y){ 	// 求坐标点构造函数
    if(x) this.x =x; 	// 初始x轴值
    if(y) this.y = y; 	// 初始y轴值
    p.prototype.x =0; 	// 默认x轴值
    p.prototype.y = 0; 	// 默认y轴值
}
function l(a,b){ 	// 求两点距离构造函数
    var a = a; 	// 参数私有化
    var b = b; 	// 参数私有化
    var w = function(){	// 计算x轴距离，返回对函数引用
        return Math.abs(a.x - b.x);
    }
    var h = function(){	// 计算y轴距离，返回对函数引用
        return Math.abs(a.y - b.y);
    }
    this.length = function(){	// 计算两点距离，中使用小括号调用私有方法w()和h()
        return Math.sqrt(w()*w() + h()*h());
    }
    this.b = function(){	// 获取起点坐标对象
        return a;
    }
    this.e = function(){	// 获取终点坐标对象
        return b;
    }
}
var p1 = new p(1,2); 	// 实例化p构造函数，声明一个点
var p2 = new p(10,20); 	// 实例化p构造函数，声明另一个点
var l1 = new l(p1,p2); 	// 实例化l构造函数，传递两点对象
alert(l1.length())	// 返回20.12461179749811，调用length()计算两点距离
l1.b().x = 50;	// 不经意改动方法b()的一个属性为50
alert(l1.length())	// 返回43.86342439892262，说明影响两点距离值

this.b = function(){	// 方法b()
    function temp(){};	// 临时构造类
    temp.prototype = a; 	// 把私有对象传递给临时构造类的原型对象
    return new temp();	// 返回实例化对象，阻断直接返回a的引用关系
}
this.e = function(){	// 方法f()
    function temp(){};	// 临时构造类
    temp.prototype = a; 	// 把私有对象传递给临时构造类的原型对象
    return new temp();	// 返回实例化对象，阻断直接返回a的引用关系
}

function l(a,b){ 	// 求两点距离构造函数
    var a = a; 	// 参数私有化
    var b = b; 	// 参数私有化
    var w = function(){	// 计算x轴距离，返回函数表达式的计算值
        return Math.abs(a.x - b.x);
    }()
    var h = function(){	// 计算y轴距离，返回函数表达式的计算值
        return Math.abs(a.y - b.y);
    }()
    this.length = function(){	// 计算两点距离，直接使用私有变量w和h来计算
        return Math.sqrt(w()*w() + h()*h());
    }
    this.b = function(){	// 获取起点坐标对象
        return a;
    }
    this.e = function(){	// 获取终点坐标对象
        return b;
    }
}
//【示例4】利用原型进行批量复制。
function f( x ){ 	// 构造函数
    this.x = x; 	// 声明本地属性
}
var a = [];	// 声明数组
for( var i = 0; i < 100; i ++ ){ 	// 使用for循环结构批量复制构造类f的同一个实例
    a[i] = new f( 10 ); 	// 把实例分别存入数组
}

function f( x ){ 	// 构造函数
    this.x = x; 	// 声明本地属性
}
var a = [];	// 声明数组
function temp(){}	// 定义一个临时的空构造类temp
temp.prototype = new f( 10 ); 	// 把构造类f实例化，并传递给构造类temp的原型对象
for( var i = 0; i < 100; i ++ ){ 	// 使用for循环批量复制临时构造类temp的同一个实例
    a[i] = new temp();	// 把实例分别存入数组
}








</script>
</head>
<body>
</body>
</html>
